# -*- coding=utf-8-*-
"""
@File:memory_selection
@Author:Created by Han X.Y
@Date:on 2021/7/19 18:18 
"""
"""
给你二叉树的根节点 root ，返回它节点值的 前序 遍历。

 

示例 1：


输入：root = [1,null,2,3]
输出：[1,2,3]
示例 2：

输入：root = []
输出：[]
示例 3：

输入：root = [1]
输出：[1]
示例 4：


输入：root = [1,2]
输出：[1,2]
示例 5：


输入：root = [1,null,2]
输出：[1,2]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


"""

"""
首先我们需要了解什么是二叉树的前序遍历：按照访问根节点——左子树——右子树的方式遍历这棵树，而在访问左子树或者右子树的时候，我们按照同样的方式遍历，直到遍历完整棵树。因此整个遍历过程天然具有递归的性质，我们可以直接用递归函数来模拟这一过程。

定义 preorder(root) 表示当前遍历到 root 节点的答案。按照定义，我们只要首先将 root 节点的值加入答案，然后递归调用 preorder(root.left) 来遍历 root 节点的左子树，最后递归调用 preorder(root.right) 来遍历 root 节点的右子树即可，递归终止的条件为碰到空节点。

作者：LeetCode-Solution
链接：https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode-solution/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
"""


# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def insert(root, val):
    if root is None:
        root = TreeNode(val)
    else:
        if root.val < val:
            root.right = insert(root.right, val)
        else:
            root.left = insert(root.left, val)

    return root


class Solution:
    def preorderTraversal(self, root):
        """
        前序遍历
        Args:
            root:

        Returns:

        """
        if not root:
            return []
        else:
            # 前序遍历
            return [root.val]+self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
            # 中序遍历
            # return self.preorderTraversal(root.left) + [root.val] + self.preorderTraversal(root.right)
            # 后序遍历
            # return self.preorderTraversal(root.left) + self.preorderTraversal(root.right) + [root.val]


if __name__ == "__main__":
    root = TreeNode(1)
    root = insert(root, 12)
    root = insert(root, 20)
    root = insert(root, 6)
    print(root)

    S = Solution()
    print(S.preorderTraversal(root))